#ifndef __ECC_IMPL_H
#define __ECC_IMPL_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/* ECCParameters定义（P-256曲线） */
#define ECC_IMPL_CURVE_SIZE    32  // 256位 = 32字节
#define ECC_IMPL_KEY_SIZE      32  // 私钥32字节
#define ECC_IMPL_PUBKEY_SIZE   64  // 公钥64字节(x,y)
#define ECC_IMPL_SIGNATURE_SIZE 64 // 签名64字节(r,s)

/* Elliptic Curve点结构 */
typedef struct {
    uint32_t x[8];  // X坐标（256位）
    uint32_t y[8];  // Y坐标（256位）
    uint8_t infinity;  // No穷远点标志
} ECC_Point;

/* ECC上下文 */
typedef struct {
    uint32_t private_key[8];  // 私钥（256位）
    ECC_Point public_key;     // 公钥点
    uint8_t key_loaded;       // KeyYesNo已Load
} ECC_Impl_Context;

/* Function声明 */

/**
 * @brief InitializeECC上下文
 * @param ctx ECC上下文指针
 */
void ECC_Impl_Init(ECC_Impl_Context* ctx);

/**
 * @brief LoadECCKey
 * @param ctx ECC上下文指针
 * @param private_key 私钥（32字节）
 */
void ECC_Impl_LoadKey(ECC_Impl_Context* ctx, const uint8_t* private_key);

/**
 * @brief Calculate公钥：Q = d*G
 * @param ctx ECC上下文指针
 */
void ECC_Impl_ComputePublicKey(ECC_Impl_Context* ctx);

/**
 * @brief ECDHKey交换：shared = d*Q
 * @param ctx ECC上下文指针
 * @param peer_pubkey 对方公钥（64字节：x||y）
 * @param shared_secret Output共享Key（32字节：x坐标）
 */
void ECC_Impl_ECDH(const ECC_Impl_Context* ctx, const uint8_t* peer_pubkey, uint8_t* shared_secret);

/**
 * @brief ECDSA签名（简化版）
 * @param ctx ECC上下文指针
 * @param hash 消息哈希（32字节）
 * @param signature Output签名（64字节：r||s）
 */
void ECC_Impl_Sign(const ECC_Impl_Context* ctx, const uint8_t* hash, uint8_t* signature);

/**
 * @brief ECDSAVerify（简化版）
 * @param pubkey 公钥（64字节）
 * @param hash 消息哈希（32字节）
 * @param signature 签名（64字节）
 * @return 1=VerifySuccess, 0=Failed
 */
int ECC_Impl_Verify(const uint8_t* pubkey, const uint8_t* hash, const uint8_t* signature);

#ifdef __cplusplus
}
#endif

#endif /* __ECC_IMPL_H */
